查看原文
其他

票房遇冷的春节档口碑冠军丨《狙击手》影评分析

爬虫俱乐部 Stata and Python数据分析 2022-12-31

本文作者:温和铭,中南财经政法大学统计与数学学院

本文编辑:谭   可

技术总编:戴   雯

Stata&Python云端课程来啦!

      为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~爬虫俱乐部推出了Python编程培训课程Stata基础课程Stata进阶课程。报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦。我们在这篇推文的最后提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~

引言
万众瞩目的2022年北京冬奥会中,浪漫大气的开幕式令人印象深刻,好评连连,总导演张艺谋功不可没。但是,作为老谋子首次参与春节档的电影《狙击手》,却没有开幕式那么受人关注,票房一度遇冷,根据猫眼电影的数据,截止2022年2月17日,《狙击手》的票房占比仅有7.7%,远低于以30.3%的比例位居票房第一名的《长津湖之水门桥》。好在冬奥会的热度让大家逐渐关注到了这部电影,在春节档收官之时,《狙击手》夺得了口碑冠军。让我们用Stata爬取影评,看看这部电影是如何在票房占比极低的情况下收获春节档最高评分的。

 一、影评爬取 

我们选择爬取的对象是老朋友——豆瓣。爬取策略主要分为两层爬虫,在第二层爬虫中还有一步提取内容的过程。在往期的公众号推文(《少年的你》影评)中,已经有详细的步骤介绍,这里仅做一个概述。

第一步:爬取影评基本信息

确定该电影影评所在的网址,遍历每一个影评页面,爬取每篇影评对应的标题、评论时间和网页链接这些基本信息,并将其读入Stata,作为下一步爬取的基础,代码如下:
clearcap mkdir "D:/douban" //创建目标文件夹cd "D:/douban" //将当前工作路径更改为此文件夹
*****第一步:爬取影评基本信息*****local p=5 //豆瓣每页显示20条影评,共有82条影评,需要爬取5页set more offforvalues i = 1/`p'{ local j=(`i'-1)*20 //定义影评对应的数字编码 di `j' cap copy"https://movie.douban.com/subject/35215390/reviews?start=`j'" temp.txt,replace //拷贝网页链接 infix strL v 1-100000 using temp.txt,clear //读入数据
preserve //起死回生命令,保留源代码,以便接下来提取影评链接和标题 keep if index(v, `"<span content=""') replace v = ustrregexra(v,"<.*?>","") //利用正则表达式懒惰模式,把<>里的内容替换为空 rename v time save time.dta ,replace //储存影评时间 restore
keep if index(v,`"<h2><a href="') split v,p(`"""') //用双引号作为分隔符分割 rename v2 url split v3,p(">") split v32,p("<") rename v321 title keep url title //储存影评的链接和标题
merge using time //横向合并 drop _merge save "影评`i'.dta",replace //第i页影评对应的url、title、time保存为影评i.dta }

到这里,我们的目标文件夹里应该出现了五个含有影评信息的dta文件,接下来使用append将它们合并成一个完整的文件:

clearlocal files:dir "." file "影评*.dta"foreach file in `files'{ append using "`file'" //把上面生成的影评i.dta合并起来 }save "影评.dta",replace
打开第一步爬虫得到的影评.dta,可以看到我们已经获取了每篇影评的链接、标题和评论时间。但是,数据集中共有246条影评数据,远远超出了我们在影片详情页看到的82条(截止2022年2月17日),对url进行sort发现(见下图),数据存在一些重复,可能是之前爬取过程中断后重新又爬了几遍,这个时候需要进行数据清洗,去掉重复部分。

*删除重复影评,每一个url只保留一个记录sort url //按url进行排序by url: gen filter=_n //对相同url的数据从1到最后一条编号keep if filter==1 //只保留第一条save "去重影评.dta", replace
去掉重复值的结果见下图,检查发现影评数回到了正常的82条。可以用drop filter去掉编号变量。

第二步:爬取影评源代码

这一步中,我们需要进入去重影评.dta中包含的每一个url中,爬取得到每篇影评的具体内容,代码如下:
use "去重影评.dta",cleargen v=""set more offforvalues i=1/`=_N'{ replace v=fileread(url) in `i' //把网页源代码拷贝到v中 while filereaderror(v[`i'])!=0 { sleep `=int(runiform()*5000+5000)' //随机休息5-10秒 replace v=fileread(url) in `i' } sleep `=int(runiform()*5000+5000)' //随机休息5-10秒 }save "影评源代码.dta",replace
这里需要注意的是,因为我们要进行很多次的模拟点击,为了防止出现过度频繁访问引起ip被封、网速过慢导致爬取失败等问题,所以在程序中加入了sleep语句,让程序在相邻的两次爬取之间休息一会儿。最终得到的含有源代码(即变量v)的数据如下图:

第三步:从源代码中提取评分和影评内容

这里的提取思路与第一步类似,使用分割、替换的方法将影评的评分和具体内容从源代码中”择“出来,代码如下:
use 影评源代码.dta,clear
* 提取评分gen score=ustrregexs(1) if ustrregexm(v,"allstar([0-9]{2})") destring score,replace replace score=score/10
* 提取影评内容split v,p(`"<div id="link-report">"' `"<div class="main-author">"')replace v2 = ustrregexra(v2,"\s","",.)replace v2 = ustrregexra(v2, "<.*?>", "",.)replace v2=ustrregexra(v2,"&nbsp|-|;","")rename v2 content
*保存数据keep title score content save "影评及信息.dta",replace
这样我们就获得了一个包含所有完整影评和评分的数据集,如下图所示:

 二、影评分析 

评分分析

有了完整的影评数据,接下来就可以开始一番分析了。《狙击手》在豆瓣电影上的评分为7.7,作为国产电影来说这个得分不算低。豆瓣评分按1~5星进行打分,这里将三颗星以下的定义为差评,三颗星对应中评,四星和五星即为好评,在之前的爬取中我们已经将星级转化成了数字得分,由此可以绘制出饼状图,看看各类评分的占比。
use 影评及信息.dta,replacedrop if score==. //删除没有给出评分的影评
gen 评价 = ""replace 评价 = "好评" if score > 3replace 评价 = "中评" if score == 3replace 评价 = "差评" if score < 3
collapse (count) score,by(评价) //分组统计评分数量egen total=sum(score) //计算评分的总数gen fre=score/totalgrstyle init //初始化图形设置grstyle set plain //去掉图形背景色graph pie fre ,over(评价) pie(5,explode color(navy *0.8)) plabel(_all percent ,size(*1) color(white))

结果显示,在给出了具体评分的豆瓣观众中,《狙击手》的好评比例高达86.21%,说明虽然观影人数比不上同期的春节档电影,但是看过《狙击手》的绝大多数观众都对该电影表示满意,这也直观反映了这部电影值得一看。

内容分析

接下来,我们通过在Stata中调用Python,实现对影评内容的分词处理,由于影评中含有形容词、动词和名词等多种类型的文字,故调用jieba.posseg获取每个词语的词性,并导入停用词表和笔者根据电影内容自制的词典,进行分词和词频统计,代码如下:
*导出为txt文档set more offcd D:\doubanuse 影评及信息.dta,clearkeep contentexport delimited using content.txt,replace
*调用Python分词clear allpythonimport jieba.possegword=[]with open(r"content.txt",encoding="utf8") as f: for i in f.readlines(): str=i word.append(str) jieba.load_userdict(r"dict.txt") #添加自定义词典with open("分词.txt","w",encoding="utf8") as f2: for unit in word: seg_list = jieba.posseg.cut(unit) for word in seg_list: f2.write(word.word+" "+word.flag+"\n")end
*分词结果导入Stata,并删除单字、缺失值、停用词import delimited using 分词.txt, clear encoding("utf-8")split v1,p(" ")drop v1rename (v11 v12) (keyword flag)drop if ustrlen(keyword) == 1 // 删除单字drop if keyword =="" //删除缺失值preserveimport delimited using 停用词表.txt, clear /// encoding("utf-8") varname(nonames)outsheet using 停用词表.txt, replace nonames noquotelevelsof v1, local(keyword)restoreforeach word in `keyword' { drop if keyword == "`word'" //删除停用词}
*词频统计bysort keyword: gen frequency = _Ngsort -frequencyduplicates dropsave wordfre,replace
最终得到的词频统计表中出现次数最多的十个词如下图所示,将这些词语串起来,即使没看过这部影片,也可以推测出大致内容,由张艺谋导演的电影《狙击手》主要讲述了一个战争故事在中国人民志愿军五班班长的带领下,我们的战士与美军作战,不畏牺牲/英勇牺牲

接下来我们使用Stata中的wordcloud命令绘制词云图,在一个html网页中直观展示所有评论者都在影评中重点写了哪些内容:
*绘制词云图clearcd D:\doubanuse wordfre,clearkeep if ustrregexm(flag, "^[anv]") keep in 1/200wordcloud keyword frequency using 词云.html, replace size(15 80) range(3840 2160)shellout 词云.html

从词云图可以看到,除了词频排名前十的词语,其他的高频词还有“精神”、“情节”、“人物”、”场景“,说明《狙击手》传达出的精神、故事情节、人物刻画和场景安排令人印象深刻。观众们形容精神的词主要有“英勇”、“热血”、“爱国”、“主旋律”等,描述情节的词主要有“精彩”、“紧张”、“残酷”等,评价人物的词主要有“冷静”、“智慧”、“野心”等,描述场景的词主要有“宏大”、“雪地”、“还原”等,此外还有一些表达情感的词语,如“喜欢”、“铭记”、“眼泪”、“致敬”等。这些词语大致描摹出了电影的轮廓,大多数为客观的中性词和正面的情感词,但也有一些诸如“煽情”、“刻意”的负面情感词,说明也有少数观众对影片的情感表达不太满意。通过对豆瓣影评的分析,我们可以对《狙击手》做一个大致的点评:这是一部英勇而热血的主旋律爱国电影,还原了在雪地中紧张而残酷的战争,刻画的人物冷静而富有智慧,影片中有几处泪点,提醒我们要铭记历史,向英雄们致敬。综合来看,《狙击手》是一部不错的春节档电影,口碑冠军名副其实。
以上就是本次爬虫的全部内容,感兴趣的朋友们快动手试试看吧!
END
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。




腾讯课堂课程二维码





            


 对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!














往期推文推荐

 学习丰县,营造良好营商环境!

 大国丢娃图:从川渝到徐州!

 丰县“失火”,殃及徐州:股市超跌近30亿!

 Unicode转义字符——编码与解码

        徐州!徐州!

        B站弹幕爬虫——冬奥顶流冰墩墩&雪容融

        不会用Stata做描述性统计表?so easy!

        丰沛之地:备足姨妈巾

 过年啦,用Python绘制一幅属于你的春联吧!

       登上爬虫俱乐部“时光机” |上“机”出发 开启一段奇妙之旅

       【基础篇】查找并输出子字符串的定位

        Stata中的小清新命令——添加观测值

        PCA(主成分分析法)降维——Python实现

       超好用的事件研究法

        如何绘制任泽平《鼓励生育基金》的几幅图

        Python 第六天——字符串

        findname——想要什么找什么

        Python字符串之“分分合合”

        PDF转docx可批量操作?——wordconvert的小技巧

        考研之后,文科生需以“do”躬“do”!

       手绘五星兴家国——用Stata绘制五星红旗

        Seminar丨董事会的性别多样化和企业创新:来自国际的证据

       Python与数据库交互——窗口函数

        Stata之post命令——数据邮递 

        爬虫俱乐部成员的Stata学习经验分享来啦!

       Seminar丨2002年萨班斯·奥克斯利法案的经济后果

        我几乎画出了“隔壁三哥”家的国旗

        Python基础——三大数字类型,你都了解吗?
        如何用Stata绘制带指向性箭头标注的图像       
       Seminar丨荐仆贷款——19世纪中国的信任辅助贷款       【技能篇】多进程队列间通信

Seminar丨公司董事会的人才增长:来自中国的证据

正则表达式--懒惰模式

爬完独立董事的年薪,我的眼镜跌破了!识别旅游“照骗”——看风景名胜是否名副其实

关于我们 


   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存